package modele;

import java.rmi.server.UnicastRemoteObject;
import java.util.SortedSet;
import java.util.TreeSet;

public class EvaluationImpl extends UnicastRemoteObject  implements Evaluation {

	/**
	 * 
	 */
	private static final long serialVersionUID = 2L;

	Dossier me;
	SortedSet<Parcours> parcoursInterdits;
	SortedSet<UniteEnseignement> uesInterdites; //, uesAcquises;
	Boolean okAdministratif;  // dossier recevable
	Boolean okPedagogique;    // obligatoire
	Boolean master1Acquis;    // necessaire pour une proposition
	Float moyenneBac4, moyenneBac3, noteDossier;
	Integer nbBac4, nbBac3;
	String remarques;

	public EvaluationImpl(Dossier dos) throws Exception {
		me = dos;
		parcoursInterdits = new TreeSet<Parcours>(new ComparatorParcours());
		uesInterdites = new TreeSet<UniteEnseignement>(new ComparatorUE());
	//	uesAcquises = new TreeSet<UniteEnseignement>(new ComparatorUE());
		okAdministratif = true;
		master1Acquis = true;
		moyenneBac4 = 0f;
		moyenneBac3 = 0f;
		nbBac4 = 1;
		nbBac3 = 1;
		noteDossier = 0f;
		okPedagogique = true;
		remarques = "";
	}

	public SortedSet<Parcours> getParcoursInterdits() throws Exception {
		return parcoursInterdits;
	}

	public SortedSet<UniteEnseignement> getUesInterdites() throws Exception {
		return uesInterdites;
	}

//	public SortedSet<UniteEnseignement> getUesAcquises() throws Exception {
//		return uesAcquises;
//	}

	public Boolean getOkAdministratif() throws Exception {
		return okAdministratif;
	}

	public Boolean getOkPedagogique() throws Exception {
		return okPedagogique;
	}

	public Boolean getMaster1Acquis() throws Exception {
		return master1Acquis;
	}

	public Float getMoyenneBac4() throws Exception {
			return moyenneBac4;
	}

	public Integer getNbBac4() throws Exception {
			return nbBac4;
	}

	public Float getMoyenneBac3() throws Exception {
			return moyenneBac3;
	}

	public Integer getNbBac3() throws Exception {
			return nbBac3;
	}

	public Float getNoteProposee() throws Exception {
		float mB4 = getMoyenneBac4();
		float mB3= getMoyenneBac3();
		float nbB4 = getNbBac4();
		float nbB3 = getNbBac3();
		
		float res = (mB4 * 3 + mB3)/4 - (nbB4 + nbB3 -2)/2;
		
		//M1 Bordeaux 1 en cours=> pas de point négatif
		Etudiant etu = me.getEtudiant();
		if(etu.getNomCursusAnnée1().startsWith("M1 Info Bdx1"))
			return res;
		if (etu.getNomCursusAnnée2().endsWith("étranger"))
			res -= 2;
		else if (etu.getNomCursusAnnée2().endsWith("Miage, Info Indus..."))  // Bac+4
			res -= 1;
		else if (etu.getNomCursusAnnée2().startsWith("Autre"))
			res -= 2;
		if (etu.getNomCursusAnnée3().endsWith("Miage, Info Indus..."))  // Bac+3
			res -= 1;
		else if (etu.getNomCursusAnnée3().startsWith("Autre"))
			res -= 2;
		else if (etu.getNomCursusAnnée3().endsWith("étranger"))
			res -= 2;
		else if (etu.getNomCursusAnnée3().startsWith("Licence Pro"))
			res -= 2;
		
		return res;

			
	}

	public Float getNoteDossier() throws Exception {
		return noteDossier;
	}

	public String getRemarques() throws Exception {
		return remarques;
	}

	public boolean addParcoursInterdits(Parcours p) throws Exception {
		// pour avoir le bon pointeur et non celui distant
		Parcours par = me.getBd().getParcours(p.getIdent());
		return parcoursInterdits.add(par);
	}

	public boolean addUesInterdites(UniteEnseignement ue) throws Exception {
		return uesInterdites.add(ue);
	}

//	public boolean addUesAcquises(UniteEnseignement ue) throws Exception {
//		return uesAcquises.add(ue);
//	}

//	public boolean addUesAcquises(Integer id) throws Exception {
//		UniteEnseignement ue = me.getBd().getUniteEnseignement(id);
//		if (ue.getIntitule().equals("Autre"))
//			return false;
//		else
//			return uesAcquises.add(ue);
//	}

	public boolean removeParcoursInterdits(Parcours p) throws Exception {
		// pour avoir le bon pointeur et non celui distant
		Parcours par = me.getBd().getParcours(p.getIdent());
		return parcoursInterdits.remove(par);
	}

	public boolean removeUesInterdites(UniteEnseignement ue) throws Exception {
		return uesInterdites.remove(ue);
	}

//	public boolean removeUesAcquises(UniteEnseignement ue) throws Exception {
//		return uesAcquises.remove(ue);
//	}

	public void clearParcoursInterdits() throws Exception {
		parcoursInterdits.clear();
	}

	public void clearUesInterdites() throws Exception {
		uesInterdites.clear();
	}

//	public void clearUesAcquises() throws Exception {
//		uesAcquises.clear();
//	}

	// 2009/06/24 JS adds safe copies in setters
	public void setOkAdministratif(Boolean b) throws Exception {
		okAdministratif = b;
	}

	public void setOkPedagogique(Boolean b) throws Exception {
		okPedagogique = b;
	}

	public void setMaster1Acquis(Boolean b) throws Exception {
		master1Acquis = b;
	}

	public void setMoyenneBac4(Float f) throws Exception {
		moyenneBac4 = f;
	}

	public void setNbBac4(Integer nb) throws Exception {
		nbBac4 = nb;
	}

	public void setMoyenneBac3(Float f) throws Exception {
		moyenneBac3 = f;
	}

	public void setNbBac3(Integer nb) throws Exception {
		nbBac3 = nb;
	}

	public void setNoteDossier(Float f) throws Exception {
		noteDossier = f;
	}

	public void setRemarques(String s) throws Exception {
		remarques=s;
	}

	// condition pour pouvoir faire une proposition
	public boolean isOK() throws Exception {
		return okAdministratif.booleanValue() && okPedagogique.booleanValue() && master1Acquis.booleanValue();
	}

	public boolean isParcoursInterdit(Parcours par) throws Exception {
		return parcoursInterdits.contains(par);
	}

//	public boolean isUEAcquise(UniteEnseignement ue) throws Exception {
//		return uesAcquises.contains(ue);
//	}

	public boolean isUEInterdite(UniteEnseignement ue) throws Exception {
		return uesInterdites.contains(ue);
	}

}
